import axios from 'axios'
import Qs from 'qs'

const config = {
  // 请求路径
  baseURL: 'billdowney-workflow',
  // 默认请求方法
  method: 'post',
  // 请求超时时间（毫秒）
  timeout: 0,
  // 是否携带cookie信息
  withCredentials: true,
  // 响应格式,可选项 'arraybuffer', 'blob', 'document', 'json', 'text', 'stream'
  responseType: 'json',
  // 自定义添加头部
  headers: {
    // ;charset=UTF-8
    'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8'
  },
  // `transformRequest` 允许在向服务器发送前，修改请求数据
  // 只能用在 'PUT', 'POST' 和 'PATCH' 这几个请求方法
  // 后面数组中的函数必须返回一个字符串，或 ArrayBuffer，或 Stream
  transformRequest: [
    function(data) {
      return Qs.stringify(data, {
        // a:[1,2] => a=1&a=2
        arrayFormat: 'repeat',
        // a[b]:1 => a.b=1
        allowDots: true
      })
    }
  ],
  paramsSerializer(data) {
    return Qs.stringify(data, {
      // a:[1,2] => a=1&a=2
      arrayFormat: 'repeat',
      // a[b]:1 => a.b=1
      allowDots: true
    })
  }
}
class HttpResponse {
  // 请求成功调用 code == 1
  successHandle = null
  // 请求异常，包含js异常调用
  errorHandle = null
  // 请求结束处理
  endHandle = null

  // 异常回调，实际上的code != 1
  exceptionHandle = (code, message) => {
    alert(`异常回调[${code}]:${message}`)
  }
  constructor() {}
  // 调用返回成功需要注入的变量
  success(handle) {
    this.successHandle = handle
    return this
  }
  // 注入异常处理方法
  exception(handle) {
    this.exceptionHandle = handle
    return this
  }
  // 调用异常需要注入的变量
  error(handle) {
    this.errorHandle = handle
    return this
  }
  // 注入
  end(handle) {
    this.endHandle = handle
  }
}

class HttpRequest {
  _axios = null

  constructor() {
    this._axios = axios.create(config)
  }

  // 返回初始化过后的axios
  getAxios() {
    return this._axios
  }
  setBaseURL(baseURL) {
    config.baseURL = baseURL
  }
  execute(requestConfig) {
    let _config = {
      baseURL: config.baseURL,
      ...requestConfig
    }
    _config.headers = _config.headers || {}
    return this._axios.request(_config)
  }
  // 默认异常请求处理
  defaultProcessError(error) {
    console.error('请求异常', error)
    if (error.response) {
      alert(error.response.data || '')
    } else {
      alert(error.message)
    }
  }

  // 发送默认请求
  send(url, params) {
    let requestConfig = {}
    requestConfig.url = url
    if (config.method === 'post') {
      requestConfig.data = params
    } else {
      requestConfig.params = params
    }
    requestConfig.baseURL = config.baseURL
    let httpResponse = new HttpResponse()
    this.execute(requestConfig)
      .then(response => {
        let json = response.data
        if (json.code === 1) {
          httpResponse.successHandle && httpResponse.successHandle(json.data, response)
        } else {
          httpResponse.exceptionHandle && httpResponse.exceptionHandle(json.code, json.message, response)
        }
      })
      .catch(error => {
        if (typeof httpResponse.errorHandle === 'function') {
          httpResponse.errorHandle(error.response.data, error.response, error)
        } else {
          this.defaultProcessError(error)
        }
      })
      .finally(() => {
        if (typeof httpResponse.endHandle === 'function') {
          httpResponse.endHandle()
        }
      })
    return httpResponse
  }
}

export default new HttpRequest()
